package com.offcn;

import java.util.Stack;

/*
实现一个特殊的栈，在实现栈的基本功能的基础上，再实现返回栈中最小元素的操作。
【要求】1.pop、push、getMin操作的时间复杂度都是O（1）。2.设计的栈类型可以使用现成的栈结构。
 */
public class Second_Way {
    public static void main(String[] args) {
        //创建MyStack2对象
        MyStack2 myStack2 = new MyStack2();
        myStack2.push(12);
       /* myStack2.pop();
        myStack2.pop();*/
        myStack2.push(-128);
       myStack2.push(36);


        System.out.println(myStack2.getMin());
    }
}

class MyStack2 {
    private Stack<Integer> stackDate;
    private Stack<Integer> stackMin;

    //构造方法
    public MyStack2() {
        this.stackDate = new Stack<>();
        this.stackMin = new Stack<>();
    }

    public void push(int num) {
        if(this.stackMin.isEmpty()) {
            stackMin.push(num);
        } else if(num < getMin()) {
            this.stackMin.push(num);
        } else {
            int newMin = this.stackMin.peek();
            this.stackMin.push(newMin);

        }
        //将数据压入数据栈
        this.stackDate.push(num);
    }

    //弹出元素
    public int pop() {
        if(this.stackDate.isEmpty()) {
            throw new RuntimeException("The Stack is empty");
        }
        this.stackMin.pop();
        return this.stackDate.pop();
    }


    public int getMin() {
        if(this.stackMin.isEmpty()) {
            throw new RuntimeException("The Stack is empty");
        }
        return this.stackMin.peek();
    }
}
